<?php

// inclure ici toutes les classes mises en $_SESSION
// require_once 'models/vo/User.php';
//require_once '../library/MAPI/Model/Movie.php';

/**
 * Bootstrap initialisant l'environnement
 *
 * @package Application
 * @author  nroche <nicolas.roche42@gmail.com>
 *
 */
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    /**
     * Constructor
     *
     * Ensure FrontController resource is registered
     *
     * @param Zend_Application|Zend_Application_Bootstrap_Bootstrapper $application application
     *
     * @return void
     */
    public function __construct($application) {
        // intialise la session

        $sessionLocale = new Zend_Session_Namespace();

        self::$_bootstrapInstance = $this;
        parent::__construct($application);
    }

    /**
     * Enregistrement des namespace utiles
     *
     * @return void
     */
    protected function _initNamespace() {
        $autoloader = Zend_Loader_Autoloader::getInstance();
        $autoloader->registerNamespace('MAPI_');
    }

    protected function _initRequest() {
        $this->bootstrap('FrontController');
        $front = $this->getResource('FrontController');
        $request = new Zend_Controller_Request_Http();
        $front->setRequest($request);
        return $request;
    }

    //     /**
    //      * Initialisation du composant JQuery
    //      */
    //     protected function _initJqueryLibrary()
    //     {
    //         $jQuery = $this->_getJQuery();
    //         // l'utilisation de la librairie potato a besoin de jquery ui
    //         $jQuery->uiEnable();
    //         $jQuery->addJavascriptFile($this->_getBaseUrl() . '/js/jquery.ui.potato.menu.js');
    //         // Instructions lancée au chargement de la page
    // //         $function = '%s(\'table.table-data > tbody > tr:nth-child(2n)\').addClass(\'alt\');';
    // //         $jQuery->addOnload(sprintf($function, ZendX_JQuery_View_Helper_JQuery::getJQueryHandler()));
    // //         $function = '%s(\'#header-menu .navigation\').ptMenu();';
    // //         $jQuery->addOnload(sprintf($function, ZendX_JQuery_View_Helper_JQuery::getJQueryHandler()));
    //     }

    /**
     * Enregistrement de la configuration de l'application dans le registre
     * sous forme de tableau
     */
    protected function _initConfig() {
        Zend_Registry::set('Zend_Config', $this->getOptions());
    }

    //------------------------------------------------------------------------
    //------------------------------------------------------------------------
    // attr/Methodes ajoutées des autres Bootstraps
    //------------------------------------------------------------------------
    //------------------------------------------------------------------------

    /**
     * Instance {@link Zend_View}
     *
     * @var Zend_View
     */
    private $_view;

    /**
     * Locale par défaut si celle fournie par le navigateur n'est pas pas correcte
     * et que la configuration 'application.ini' ne dispose pas de locale par défaut.
     *
     * Généralement si le script fait appel à cette constante ce qu'il y a eu un problème.
     *
     *
     * @var string
     */

    const DEFAULT_LOCALE = 'en';

    /**
     * View object getter
     *
     * @return Zend_View
     */
    protected function _getView() {
        if (!isset($this->_view)) {
            $this->bootstrap('view');
            $this->_view = $this->getResource('view');
        }
        return $this->_view;
    }

    /**
     * Initialisation du système de cache notemment pour l'objet Zend_Translate
     *
     * @return void
     */
    protected function _initCache() {
        $frontendOptions = array(
            'lifetime' => 2678400, // temps de vie du cache de 1 mois
            'automatic_serialization' => true
        );

        $backendOptions = array(
            // Répertoire où stocker les fichiers de cache
            'cache_dir' => APPLICATION_PATH . '/../data/cache/'
        );

        // créer un objet Zend_Cache_Core
        $cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

        // enregistrement de l'objet cache
        Zend_Registry::set('Zend_Cache', $cache);
    }

    /**
     * Initialise l'objet de traduction
     *
     * @return void
     */
    protected function _initTranslate() {
        // utilisation du système de cache
        Zend_Translate::setCache(Zend_Registry::get('Zend_Cache'));

        // construction de l'objet de traduction
        $path = APPLICATION_PATH . '/../data/translations/';
        $scan = array('scan' => Zend_Translate::LOCALE_DIRECTORY);
        $translate = new Zend_Translate('array', $path, $this->_getDefaultLocale(), $scan);



        // on cherche dans la liste des locales acceptées par l'utilisateur
        //         $locales = array_keys(Zend_Locale::getBrowser());
        //         // plus celle définie
        // NRO : crée l'erreur : Fatal error: Uncaught exception 'Zend_Exception'
        // with message 'No entry is registered for key 'Zend_Locale'' in
        // C:\workspace\Facilities.php\Zend\Registry.php on line 147
        //         array_unshift($locales, Zend_Registry::get('Zend_Locale'));
        //         foreach ($locales as $locale) {
        //             if ($translate->getAdapter()->isAvailable($locale)) {
        //                 $translate->getAdapter()->setLocale($locale);
        //                 break;
        //             }
        //         }

        Zend_Registry::set('Zend_Translate', $translate);
    }

    /**
     * Getter de la locale par défaut. Cette locale provient soit de l'option 'defaultLocale'
     * du fichier de configuration 'application.ini' ou de la constante 'self::DEFAULT_LOCALE' de
     * la classe.
     *
     * @return string locale par défaut
     */
    protected function _getDefaultLocale() {
        if ($this->hasOption('defaultLocale')) {
            // locale définie dans le fichier de configuration application.ini
            return new Zend_Locale($this->getOption('defaultLocale'));
        } else {
            return new Zend_Locale(self::DEFAULT_LOCALE);
        }
    }

    /**
     * Initialise la locale utilisée
     *
     * @return void
     */
    protected function _initLocale() {
        //         $locale = new Zend_Locale($this->getOption('defaultLocale'));
        // NRO
        $locale = 'fr_FR';

        Zend_Registry::set('Zend_Locale', $locale);
    }

    /**
     * Essaie de se connecter à la base de données avec les paramètres de connexion. Si la connexion est établie,
     * cette méthode configure le nouvel adapter comme étant l'adapteur par défaut pour la base de données
     *
     * @param string|Zend_Config $adapter adapteur à utiliser
     * @param array|Zend_Config  $params  paramètres de connexion à la base de données
     *
     * @return boolean
     */
    private function _connectToDatabase($adapter, $params) {
        // création de l'adapter
        $database = Zend_Db::factory($adapter, $params);

        try {

            // test de connexion
            $database->getConnection();
            // adapteur par défaut
            Zend_Db_Table::setDefaultAdapter($database);
            // Pour améliorer les performances lors de l'utilisation des
            // fonctions de Zend_Db_Table
            Zend_Db_Table_Abstract::setDefaultMetadataCache(Zend_Registry::get('Zend_Cache'));
            // en développement on profile les requêtes en base
            // Création du profileur
            if (in_array(APPLICATION_ENV, array('development'))) {
                $profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
                $profiler->setEnabled(true);
                // Attacher le profileur à votre adaptateur de base de données
                $database->setProfiler($profiler);
            }

            if ($this->_enableDbProfiler) {
                // Création du profileur
                $profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
                $profiler->setEnabled(true);
                // Attacher le profileur à votre adaptateur de base de données
                $database->setProfiler($profiler);
            }
            return true;
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Initialisation du menu principal
     *
     * @return void
     */
    protected function _initMenus() {
        // menu principal
        try {
            $menu = new Zend_Navigation(new Zend_Config_Xml(APPLICATION_PATH . '/../data/menu.xml', 'nav'));
        } catch (Exception $e) {
            var_dump($e);
            die;
        }
//         // on supprime certaines pages si on est pas sur uyn serveur de développement
//         if (!in_array(APPLICATION_ENV, array('development', 'integration', 'devel3'))) {
//             foreach ($menu->getPages() as $key => $page) {
//                 // on supprime les exemples de codes des librairies Zend et Paybox
//                 if (in_array($page->getId(), array('zend', 'paybox', 'php_tools'))) {
//                     $menu->removePage($page);
//                 }
//             }
//         }

        Zend_Registry::set('Zend_Navigation', $menu);
    }

    /**
     * On déporte la connexion à la base de données dans une méthode public afin
     * qu'une application puisse le faire elle-même si elle le souhaite.
     *
     * Pour cela il faut
     * <ul>
     * <li>surcharger la méthode _initDb dans le bootstrap de l'application
     * afin de ne pas initialiser la base de données (ou de le faire de façon conditionnelle)</li>
     * <li>appeller cette méthode qui initialisera l'adapteur et lenregistrera en tant qu'adapteur par défaut</li>
     * <ul>
     */
//     public static function initializeDatabaseAdapter()
//     {
//         $section = self::DEFAULT_DATABASE_SECTION;
// //             // locale définie dans le fichier de configuration application.ini
// // //             return new Zend_Locale($this->getOption('defaultLocale'));
// //          $test42 = Zend_Config::get('db');
//         if (! self::getInstance()->_connectToDatabase('pdo_mysql',
//             array(
//                 'host' => 'localhost',
//                 'username' => '',
//                 'password' => '',
//                 //                 'port' => $dbConfig->port1,
//                 'dbname' => 'mediaglobe',
//             ))) {
//             echo 'initializeDatabaseAdapter error';
//             die;
//         }
//     }

    /**
     * Initialise la connexion à la base de données
     *
     * @return void
     */
    protected function _initDb() {
        $resources = $this->getOption('resources');
        $adapter = $resources['db']['adapter'];
        $params = $resources['db']['params'];
        $host = $params['host'];
        $dbname = $params['dbname'];
        $username = $params['username'];
        $password = $params['password'];

        if (!self::getInstance()->_connectToDatabase($adapter, array(
                    'host' => $host,
                    'username' => $username,
                    'password' => $password, /* 'port' => '', */
                    'dbname' => $dbname,
                ))) {
            echo "Bootstrap::_initDb -> erreur de connection à la DB : $host, $username, $password, $dbname";
            die;
        }

//         self::initializeDatabaseAdapter();
    }

    /**
     * Instance unique de bootstrap
     *
     * @var MediaGlobe_Application_Bootstrap_Abstract
     */
    protected static $_bootstrapInstance;

    /**
     * getter du singleton Bootstrap
     *
     * @return MediaGlobe_Application_Bootstrap_Abstract
     */
    public static function getInstance() {
        return self::$_bootstrapInstance;
    }

    /**
     * Section du fichier de configuration 'connexion_php.conf' à utiliser pour
     * établir la connexion à la base de données. Pour la changer il suffit de
     * reseigner la variable 'database_section' dans le fichier 'application.ini'
     * d'une application
     *
     * @var string
     */

    const DEFAULT_DATABASE_SECTION = 'DATABASE';

    /**
     * Initialisation des styles
     *
     * @return void
     */
    protected function _initStyles() {
        $view = $this->_getView();
        $view->headLink()->appendStylesheet($view->baseUrl() . '/css/style.css');
        $view->headLink()->appendStylesheet($view->baseUrl() . '/css/jquery.ui.potato.menu.css');
        $view->headLink()->appendStylesheet($view->baseUrl() . '/css/cupertino/jquery-ui-1.10.0.custom.min.css');
    }

    /**
     * Initialisation des scripts
     *
     * @return void
     */
    protected function _initScripts() {
        $view = $this->_getView();
        $view->headScript()->appendFile($view->baseUrl() . '/js/jquery-1.9.0.js');
        $view->headScript()->appendFile($view->baseUrl() . '/js/jquery-ui-1.10.0.custom.min.js');
        $view->headScript()->appendFile($view->baseUrl() . '/js/mediaglobe.js');
    }

    protected function _initCookies(){
        $this->bootstrap('FrontController');
        $frontController = $this->getResource('frontController');
        $baseurl = $frontController->getBaseUrl();

        setrawcookie('baseurl', $baseurl);
    }

    /**
     * Initialise le docType et le header HTML
     *
     * @return void
     */
    protected function _initHTMLHeader() {
        $view = $this->_getView();
        $view->doctype(Zend_View_Helper_Doctype::HTML5);

//         // View Helpers
//         $view->addScriptPath(
//             array(
//                 APPLICATION_PATH . '/views/partials/',
//                 APPLICATION_PATH . '/views/scripts/',
//             )
//         );

        $view->headMeta()->setCharset($view->getEncoding())
                ->appendName('application-name', $this->getOption('application_name') . ' ' . $this->getOption('version'));
    }

}

